#pragma once

#include <QString>
#include <memory>

namespace kernel {

/**
 * @brief 日志器抽象接口
 * 
 * 定义了应用程序中日志记录的抽象契约。
 * 这个接口可以被不同的日志器实现，如基于spdlog的实现、
 * 基于Qt的实现，或用于测试的Mock实现。
 */
class ILogger {
public:
    enum LogLevel {
        Trace,
        Debug,
        Info,
        Warning,
        Error,
        Critical
    };

    virtual ~ILogger() = default;

    /**
     * @brief 记录日志
     * @param level 日志级别
     * @param message 日志消息
     * @param file 源文件名（可选）
     * @param line 行号（可选）
     * @param function 函数名（可选）
     */
    virtual void log(LogLevel level, const QString& message, 
                     const char* file = nullptr, int line = 0, 
                     const char* function = nullptr) = 0;

    // 便利方法
    virtual void debug(const QString& message) = 0;
    virtual void info(const QString& message) = 0;
    virtual void warning(const QString& message) = 0;
    virtual void error(const QString& message) = 0;
    virtual void critical(const QString& message) = 0;

    /**
     * @brief 获取日志器名称（用于标识不同的日志器实例）
     * @return 日志器名称
     */
    virtual QString name() const = 0;

    /**
     * @brief 设置日志级别
     * @param level 日志级别
     */
    virtual void setLevel(LogLevel level) = 0;

    /**
     * @brief 获取当前日志级别
     * @return 当前日志级别
     */
    virtual LogLevel level() const = 0;
};

/**
 * @brief 日志器工厂接口
 * 
 * 用于创建不同类型的日志器实例
 */
class ILoggerFactory {
public:
    virtual ~ILoggerFactory() = default;

    /**
     * @brief 创建具名日志器
     * @param name 日志器名称
     * @return 日志器实例
     */
    virtual std::shared_ptr<ILogger> createLogger(const QString& name) = 0;

    /**
     * @brief 获取默认日志器
     * @return 默认日志器实例
     */
    virtual std::shared_ptr<ILogger> getDefaultLogger() = 0;
};

} // namespace kernel 